#ifndef PROGRAMCHECK_H
#define PROGRAMCHECK_H

#include "../CommunicateDelegate/hmicommunicate.h"

enum EM_PAL_CHECK_TYPE
{
    PAL_CHECK_HEAD,
    PAL_CHECK_A,
    PAL_CHECK_BTM,
    PAL_CHECK_R,
    PAL_CHECK_END
};

class ProgramCheck
{
public:
    ProgramCheck();


    /**
     * @brief patExect                  检查语法正确性,只做了指令类别的判断，可以取消检查。
     * @param programStr
     * @return
     */
    int patExect(QString programStr, int rowIndex);

    /**
     * @brief getCurrentPointMaxNumber  检查全文获取当前文件的P点最大
     * @param programStr
     * @return
     */
    int getArmPointIndex(QString programStr);

    /**
     * @brief checkPalletCmdList        检查 码垛合法性
     * @param init                      true 开始检查 false 初始化未完成,继续添加(添加完后再判断)
     */
    int checkPalletCmdList(bool init, QString list, int row);//返回异常码垛编号

private:
    /**
     * @brief palletListRow             编号palNum(0-); 类型palType(0-4);
     *                                  size:          size:5
     * 此为码垛指令对应行号的缓存; 可以检查 : 每一个单独码垛指令的 顺序合法性
     */
    QVector<QVector <int> > palletListRow;

private:
//    /**
//     * @brief str_rx_num       常数匹配字符串
//     */
//    QString str_rx_num;
//    /**
//     * @brief str_rx_float      浮点数字符串
//     */
//    QString str_rx_float;
//    /**
//     * @brief str_rx_anyStr     所有字符的字符串
//     */
//    QString str_rx_anyStr;
//    /**
//     * @brief srt_rx_notes      注释
//     */
//    QString srt_rx_notes;
//    /**
//     * @brief str_rx_opt_DOWNTO_TO  循环ｆｏｒ
//     */
//    QString str_rx_opt_DOWNTO_TO;
//    /**
//     * @brief str_rx_opt_AND_OR     条件ＩＦ
//     */
//    QString str_rx_opt_AND_OR;
//    /**
//     * @brief str_rx_opt_ON_OFF     开关ＩＯ
//     */
//    QString str_rx_opt_ON_OFF;
//    /**
//     * @brief str_rx_opt_Operation  计算（全部运算符）
//     */
//    QString str_rx_opt_Operation;
//    /**
//     * @brief str_rx_opt_Operation_2    计算（只有加减运算符）
//     */
//    QString str_rx_opt_Operation_2;
//    /**
//     * @brief str_rx_opt_Match      比较
//     */
//    QString str_rx_opt_Match;
//    /**
//     * @brief str_rx_opt_Match_2    比较, 部分指令只能使用＝ 或者 <>
//     */
//    QString str_rx_opt_Match_2;
//    /**
//     * @brief str_rx_zkh_i          中括号值匹配格式： [ R[i] ] ，  [ i ]
//     */
//    QString str_rx_zkh_i;
//    /**
//     * @brief str_rx_zkh_ij         中括号值匹配格式： [ R[i], R[i] ] ，  [ i, j ] ,    [ 5, R[i] ]
//     */
//    QString str_rx_zkh_ij;
//    /**
//     * @brief str_rx_zkh_ijk        中括号值匹配格式： [ R[i], R[i], R[i] ],    [ i, j, k ] ,    [ i,  R[i], 6 ]
//     */
//    QString str_rx_zkh_ijk;
//    /**
//     * @brief str_rx_R_i            普通暂存器:  R[ R[i] ],    R[i]
//     */
//    QString str_rx_R_i;
//    /**
//     * @brief str_rx_PR_i           位置寄存器:  P[i] ,   PR[i],
//     */
//    QString str_rx_PR_i;
//    /**
//     * @brief str_rx_PR_ij          PR[i, j] ; 不同格式后面运算的条件不一样
//     */
//    QString str_rx_PR_ij;
//    /**
//     * @brief str_rx_PL_i           栈板寄存器:  PL[i] ,
//     */
//    QString str_rx_PL_i;
//    /**
//     * @brief str_rx_PL_ijk_val     PL[i, j, k] ;
//     */
//    QString str_rx_PL_ijk_val;
//    /**
//     * @brief str_rx_PL_ijk         PL[i, j, k] ;不同格式后面运算的条件不一样 ,    [*, R[1], 3 ]
//     */
//    QString str_rx_PL_ijk;
//    /**
//     * @brief str_UF_i              用户坐标系
//     */
//    QString str_UF_i;
//    /**
//     * @brief str_TF_i              工具坐标系
//     */
//    QString str_TF_i;
//    /**
//     * @brief str_rx_SR             字符串寄存器( 暂不支持 )
//     */
//    QString str_rx_SR;
//    /**
//     * @brief str_rx_io_i_all       IO  , 只有 IO 在前面的指令才被认为是 IO指令
//     */
//    QString str_rx_io_i_all;
//    /**
//     * @brief str_rx_TIMER          定时器： TIMER|TIMER_OVERFLOW
//     */
//    QString str_rx_TIMER;
//    /**
//     * @brief str_rx_TIMER_opt      定时器的运算表达式
//     */
//    QString str_rx_TIMER_opt;
//    /**
//     * @brief str_rx_ri_tmp1        R[i] 运算表达式
//     */
//    QString str_rx_ri_tmp1;
//    /**
//     * @brief str_rx_R_i_ALL        R[i] 运算表达式
//     */
//    QString str_rx_R_i_ALL;
//    /**
//     * @brief str_rx_R_i_opt        寄存器操作
//     */
//    QString str_rx_R_i_opt;
//    /**
//     * @brief str_rx_R_i_opt_2      条件判断寄存器比较
//     */
//    QString str_rx_R_i_opt_2;
//    /**
//     * @brief str_rx_PL_opt_tmp1    PL运算表达式
//     */
//    QString str_rx_PL_opt_tmp1;
//    /**
//     * @brief str_rx_PL_opt         ＰＬ操作
//     */
//    QString str_rx_PL_opt;
//    /**
//     * @brief str_rx_PL_opt_2       条件判断ＰＬ
//     */
//    QString str_rx_PL_opt_2;
//    /**
//     * @brief str_rx_PR_opt_tmp1    PR 运算表达式
//     */
//    QString str_rx_PR_opt_tmp1;
//    /**
//     * @brief str_rx_PR_i_opt      PR[ｉ]
//     */
//    QString str_rx_PR_i_opt;
//    /**
//     * @brief str_rx_PR_ij_opt     PR[ｉ,ｊ]
//     */
//    QString str_rx_PR_ij_opt;
//    /**
//     * @brief str_rx_PR_opt        ＰＲ－ＡＬＬ
//     */
//    QString str_rx_PR_opt;
//    /**
//     * @brief str_rx_io_i_a        IO 运算表达式
//     */
//    QString str_rx_io_i_a;
//    /**
//     * @brief str_rx_IO_a_opt       IO 运算表达式
//     */
//    QString str_rx_IO_a_opt;
//    /**
//     * @brief str_rx_IO_a_opt_2     IO 运算表达式
//     */
//    QString str_rx_IO_a_opt_2;
//    /**
//     * @brief str_rx_io_i_b         IO 运算表达式
//     */
//    QString str_rx_io_i_b;
//    /**
//     * @brief str_rx_IO_b_opt       IO 运算表达式
//     */
//    QString str_rx_IO_b_opt;
//    /**
//     * @brief str_rx_IO_b_opt_2     IO 运算表达式
//     */
//    QString str_rx_IO_b_opt_2;
//    /**
//     * @brief str_rx_IO_opt         IO 运算表达式
//     */
//    QString str_rx_IO_opt;
//    /**
//     * @brief str_rx_IO_opt_2       IO 运算表达式
//     */
//    QString str_rx_IO_opt_2;
//    /**
//     * @brief str_rx_io_i_c         IO 运算表达式
//     */
//    QString str_rx_io_i_c;
//    /**
//     * @brief str_rx_PULSE_opt      IO指令->脉冲，   // DO[R[3]]= PULSE , 1.2 sec,   DO[1]= PULSE
//     */
//    QString str_rx_PULSE_opt;
//    /**
//     * @brief str_rx_REG            寄存器指令
//     */
//    QString str_rx_REG;
//    /**
//     * @brief str_rx_IO             IO指令
//     */
//    QString str_rx_IO;
//    /**
//     * @brief str_rx_CALL           调用指令：CALL *
//     */
//    QString str_rx_CALL;
//    /**
//     * @brief str_rx_RUN           调用指令： RUN *
//     */
//    QString str_rx_RUN;
//    /**
//     * @brief str_rx_LBL           标签指令：LBL[ R[i] ] ， LBL[ i ] , 暂不支持注释
//     */
//    QString str_rx_LBL;
//    /**
//     * @brief str_rx_JMP           跳转指令：JMP LBL[ R[i] ]
//     */
//    QString str_rx_JMP;
//    /**
//     * @brief str_rx_UFRAME         用户坐标系指令
//     */
//    QString  str_rx_UFRAME;
//    QString  str_rx_UFRAME2;
//    /**
//     * @brief str_rx_UTOOL          工具坐标系指令
//     */
//    QString  str_rx_UTOOL;
//    QString  str_rx_UTOOL2;
//    /**
//     * @brief str_rx_motion_J       运动指令Ｊ
//     */
//    QString str_rx_motion_J;
//    /**
//     * @brief str_rx_motion_L       运动指令Ｌ
//     */
//    QString str_rx_motion_L;
//    /**
//     * @brief str_rx_motion_C       运动指令Ｃ
//     */
//    QString str_rx_motion_C;
//    /**
//     * @brief str_rx_motion_C_1     运动指令Ｃ
//     */
//    QString str_rx_motion_C_1;
//    /**
//     * @brief str_rx_motion_C_2     运动指令Ｃ
//     */
//    QString str_rx_motion_C_2;
//    /**
//     * @brief str_rx_motion_A       运动指令Ａ
//     */
//    QString str_rx_motion_A;
//    /**
//     * @brief str_rx_motion_STAMP   运动指令 冲压专用
//     */
//    QString str_rx_motion_STAMP;
//    /**
//     * @brief str_rx_MOTION         所有运动指令
//     */
//    QString str_rx_MOTION;
//    /**
//     * @brief str_rx_PALL_HEAD      堆栈指令头
//     */
//    QString str_rx_PALL_HEAD;
//    /**
//     * @brief str_rx_PALL_MOTION    堆栈运动指令
//     */
//    QString str_rx_PALL_MOTION;
//    /**
//     * @brief str_rx_PALL_HAND      堆栈辅助点
//     */
//    QString str_rx_PALL_HAND;
//    /**
//     * @brief str_rx_PALL_END       堆栈结束
//     */
//    QString str_rx_PALL_END;
//    /**
//     * @brief str_rx_PALLETIZING    堆栈指令
//     */
//    QString str_rx_PALLETIZING;
//    /**
//     * @brief str_rx_wait_delay     等待指令 : WAIT 10.5sec    , WAIT R [ 1 ] ,   WAIT R [ 2 ] <> 1 , WAIT R [ R [ 1 ]] >= 200
//     */
//    QString str_rx_wait_delay;
//    /**
//     * @brief str_rx_wait_else      等待指令 :TIMEOUT LBL [ 1 ] ,
//     */
//    QString str_rx_wait_else;
//    /**
//     * @brief str_rx_WAIT           等待综合指令
//     */
//    QString str_rx_WAIT;
//    /**
//     * @brief str_rx_requirement    判断条件
//     */
//    QString str_rx_requirement;
//    /**
//     * @brief str_rx_proc           处理
//     */
//    QString str_rx_proc;
//    /**
//     * @brief str_rx_IF             IF 指令  , 部分条件只能用( <> = )判断符号
//     */
//    QString str_rx_IF;
//    /**
//     * @brief str_rx_SELECT_start   SELECT 指令头
//     */
//    QString str_rx_SELECT_start;
//    /**
//     * @brief str_rx_SELECT_mid     SELECT 指令中间部分
//     */
//    QString str_rx_SELECT_mid;
//    /**
//     * @brief str_rx_SELECT_end     SELECT尾
//     */
//    QString str_rx_SELECT_end;
//    /**
//     * @brief str_rx_SELECT         SELECT指令
//     */
//    QString str_rx_SELECT;
//    /**
//     * @brief str_rx_FOR            for指令
//     */
//    QString str_rx_FOR;
//    /**
//     * @brief str_rx_ENDFOR         endFor指令
//     */
//    QString  str_rx_ENDFOR;

//    /**
//     * @brief str_rx_END            结束\暂停\终止 指令   时间控制指令
//     */
//    QString str_rx_END;
//    QString str_rx_PAUSE;
//    QString str_rx_ABORT;
//    QString str_rx_TIMER_CTRL;

//    QString str_rx_process;

//    /**
//     * @brief str_rx_MESSAGE        消息\速率\报警\RSR 指令
//     */
//    QString  str_rx_MESSAGE;
//    QString  str_rx_OVERRIDE;
//    QString  str_rx_UALM;
//    QString  str_rx_RSR;

//    /**
//     * @brief str_rx_other          其他类指令综合
//     */
//    QString str_rx_other;

//    //QString str_rx_VISION;
//    /**
//     * @brief str_rx_vision         视觉指令
//     */
//    QString str_rx_vision;

//    /**
//     * @brief str_rx_MOVE_MAG/str_rx_MOVE_FREE      磁导航/自由导航
//     */
//    QString str_rx_MOVE_MAG;
//    QString str_rx_MOVE_FREE;

//    /**
//     * @brief str_rx_MODBUS_START       起始/读寄存器/写寄存器
//     */
//    QString str_rx_MODBUS_START;
//    QString str_rx_MODBUS_READ;
//    QString str_rx_MODBUS_WRITE;

//    /**
//     * @brief str_rx_SET_ODOM           设置重置里程计
//     */
//    QString str_rx_SET_ODOM;

//    /**
//     * @brief str_rx_TCP_START          TCP以太网通信-联通
//     */
//    QString str_rx_TCP_START;

//    /**
//     * @brief str_rx_TCP_READ           TCP以太网通信-接收
//     */
//    QString str_rx_TCP_READ;

//    /**
//     * @brief str_rx_TCP_WRITE          TCP以太网通信－发送
//     */
//    QString str_rx_TCP_WRITE;

//    /**
//     * @brief str_rx_Music              音乐指令正则表达式字符串
//     */
//    QString str_rx_Music;

//    /**
//     * @brief str_rx_Charging           充电指令表达式字符串
//     */
//    QString str_rx_Charging;

//    /**
//     * @brief str_rx_liftMechanism       升降机构指令正则表达式字符串
//     */
//    QString str_rx_liftMechanism;

//    /**
//     * @brief str_rx_loadMap             加载地图指令正则表达式字符串
//     */
//    QString str_rx_loadMap;

//    /**
//     * @brief str_rx_checkBattery             电池电量检测指令
//     */
//    QString str_rx_checkBattery;
//    /**
//     * @brief str_rx_waitCommand             呼叫指令
//     */
//    QString str_rx_waitCommand;

//    /**
//     * @brief str_rx_robotMove                机械手控制指令
//     */
//    QString str_rx_robotMove;

//    /**
//     * @brief str_rx_roller                     滚筒指令
//     */
//    QString str_rx_roller;
};

#endif // PROGRAMCHECK_H
